＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

                        PC-FXGAオーサリングソフトウェア
                      『ＧＭＡＫＥＲ』スタータキット(Ver.1.1)
                          ”ＦＩＬＥＬＩＢ．Ａ”の解説

                                        日本電気ホームエレクトロニクス株式会社
                                                        １９９５年  ５月３０日

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

目次

第１章  バックアップファイル管理ライブラリ概要
１．１  ファイル管理における諸注意

第２章  ファイルアクセス関数
２．１  ファイルシステムの初期設定と標準デバイスのマウント      fsys_init
２．２  新しいファイルシステムの追加マウント                    fsys_mount
２．３  マウント済みのドライバとの直接インターフェース          fsys_ctrl
２．４  ファイルシステムのポインタの取得                        fsys_getfsys
２．５  ファイルシステムのフォーマット                          fsys_format
２．６  ファイルシステムの空き容量の取得                        fsys_diskfree
２．７  ファイルシステムの論理ブロックサイズの取得              fsys_getblocks
２．８  ファイルのオープン                                      fsys_open
２．９  ファイルからのデータ読み込み                            fsys_read
２．１０  ファイルへのデータ書き込み                            fsys_write
２．１１  ファイルポインタの移動                                fsys_seek
２．１２  ファイルの修正日時の設定と読み出し                    fsys_htime
２．１３  ファイルのクローズ                                    fsys_close
２．１４  ファイルの削除                                        fsys_delete
２．１５  ファイル名変更                                        fsys_rename
２．１６  ディレクトリ作成                                      fsys_mkdir
２．１７  ディレクトリ削除                                      fsys_rmdir
２．１８  カレントディレクトリの移動                            fsys_chdir
２．１９  カレントディレクトリの取得                            fsys_curdir
２．２０  ファイル検索の開始                                    fsys_ffiles
２．２１  ファイル検索の継続                                    fsys_nfiles
２．２２  ファイル検索の終了                                    fsys_efiles
２．２３  システム内部日付の設定と読み出し                      fsys_datetime

第３章  内蔵ＳＲＡＭの扱いについて

第４章  外部カードの扱いについて
４．１  ８Ｍバイトの場合
４．２  ４Ｍバイトの場合
４．３  ２Ｍバイトの場合
４．４  １Ｍバイトの場合
４．５  ５１２Ｋバイトの場合
４．６  ２５６Ｋバイトの場合
４．７  １２８Ｋバイトの場合

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第１章  バックアップファイル管理ライブラリ概要


本ライブラリで提供されるのファイル管理方法は、基本的には MS-DOS準拠のFAT管理に
よるものとなります。標準として、内部メモリ（SRAM）ファイルシステム、外部カード
ファイルシステムが提供されます。
これらのファイルシステムを追加した場合も、標準の関数群で扱う事が可能です。


■１．１  ファイル管理における諸注意


DOSコンパチファイルシステムカーネルを利用すると、MS-DOSと同等のファイル管理を
行う事ができますが、MS-DOSと以下の点のような相違があるので注意してください。

(1)認識するファイル名の長さ
MS-DOSでは、主ファイル名８文字＋拡張子名３文字を認識しますが本ファイルシステム
では、主ファイル名18文字＋拡張子名３文字を認識します。
主ファイル名と拡張子は‘.’で区切られます。
ファイルの既存チェック、検索時には、21文字すべてが比較されます。

(2)ファイル名に使用できる文字
記号（$&#%`'@_^(){}~!）、英文字、数字、1バイトカタカナ、漢字（SJIS）が使用でき
ます。

(3)英大文字と英小文字の区別
英大文字と英小文字は、異なる文字として扱われます。
大文字のファイルを小文字のファイル名で操作しようとしたり、その逆をすると異なる
ファイル名として扱われ、目的のファイルを操作できないので注意してください。

(4)パス名の区切り記号
パス名の区切り記号は、\記号ではなく/記号です。

\記号は0x5cを、/記号は0x2fを表します。
\記号は区切り記号にならないので注意してください。

(5)ドライブ名の概念
本ファイルシステムには、ドライブ名という概念は存在しません。
アクセスされる媒体は、ドライブ名ではなくパスの位置で切り替えられます。

(6)読み出し専用属性
本ファイルシステムには、読み出し専用属性の概念は存在しません。
MS-DOSでは、読み出し専用属性の付いたファイルやディレクトリに対し書き込みを行う
ことができませんが、本ファイルシステムでは読み出し専用属性は無視され書き込みや
消去が可能です。


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第２章  ファイルアクセス関数


■２．１  ファイルシステムの初期設定と標準デバイスのマウント


《名称》
fsys_init

《形式》
#include <fsys.h>
#include <syswork.h>

int fsys_init(unsigned char *heap_start, unsigned char *heap_end, int (*err_trap)());

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #HeapStartAddress,ra0
mov.w #HeapEndAddress,ra1
mov.w #ErrorHandlerFunctionAddress,ra2
call fsys_init

《解説》
ファイルシステムの初期設定、内部日付の初期化、標準デバイスのマウントを行いま
す。
ファイルシステムの初期設定では、システム内部で使用するヒープ領域の初期化も行い
ます。
内部日付の初期化では、「日付なし(1980年０月０日０時０分０秒)」に初期化します。
内部日付は、ボリューム名の作成日付、ディレクトリの作成日付に使用されます。

標準デバイスのマウントでは、以下の２つのデバイスがマウントされます。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
デバイス名｜アクセスパス｜対象ハードウェア｜PC-FXGAで実現している
          ｜            ｜                ｜ エミュレート用DOSファイル名
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
/DOS/SRAM/｜/SRAM       ｜内部メモリ      ｜PCFXBACK.RAM
/DOS/CARD/｜/CARD       ｜外部カード      ｜PCFXCARD.RAM
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−


PC-FXでは内部メモリ、外部カードとして使用するものを、PC-FXGAではDOSファイルで
エミュレートしています。
これらがマウントされたかどうかはfsys_getfsysで調べてください。

ヒープ領域の初期化の為に、ヒープ領域（動的メモリ管理領域）の先頭と末尾を指定す
る必要があります。
heap_startには、ヒープ領域の先頭ポインタ（通常、bss領域の終りのポインタを表す
_E_stk_bssを指定）を指定します。
heap_endには、ヒープ領域の末尾ポインタ＋１（通常、syswork.hに定義されている
long MEMENDの内容＋１）を指定します。
err_trapには、エラー処理用関数のポインタを指定します。この関数の引数と戻り値は
、以下のように決められています。

int err_trap(int function, DPB *dpb_ptr, int err_code);

functionにはIO_READ、IO_WRITE、IO_CHECK、IO_CTRL、IO_WCHECKが渡されます。
それぞれにエラーが発生したときのエラー処理関数の働きを表します。

IO_READ     読み込み中
IO_WRITE    書き込み中
IO_CHECK    I/Oチェック中（読み込み前、継続した書き込み前）
IO_CTRL     直接制御（fsys_ctrl発行中）
IO_WCHECK   チェック中（初回の書き込み前）にエラーが発生し、エラー処理関数が呼
            ばれた事を表わします。

dpb_ptrには、エラーが発生したデバイスのデバイスパラメータブロックへのポインタ
が渡されます。
デバイスパラメータブロックの構造体DPBは以下の構造です。

    typedef struct dpb {
    int  dev_id;           /* SCSI_ID or hnd */
    long rec_offset;       /* record offset */
    int  rec_sft;          /* dos_record -> bios_rec */
    int  sft_byt;          /* bios_rec -> bytes */
    int (* dev_call)();    /* device i/o job */
    unsigned short ej_flg; /* eject ok(=1) ng(=0) flg */
    unsigned short secsiz; /* Bytes per sector */
    unsigned char secsft;  /* Bytes per sector sft count */
    unsigned char clsiz;   /* Sector per Cluster */
    unsigned char clsft;   /* Sector per Cluster  sft count */
    unsigned char mid;     /* Media descriptor */
    unsigned long fattop;  /* fat top sector */
    unsigned char nfat;    /* Number of FAT tables */
    unsigned char fatlen;  /* Sectors in FAT */
    unsigned short fat_max;/* fat data max 2-??? */    
    unsigned long dirtop;  /* root dir top sector */
    unsigned short dircnt; /* root dir entrys per sector */
    unsigned short dirlen; /* root dir sectors */
    unsigned long datatop; /* data top sector */
    long free_fat;         /* free fat count (-1=no calc) */
    unsigned short new_fat;/* last accsess new fat */
    unsigned short def_fat;/* curdir fat(root=0) */
    unsigned char def_dir[64];/* curdir dir name(root='\') */
    } DPB ;

err_codeには、発生したエラーの種別を示す負の数が渡されます。
エラー処理関数は、以下の３種類の戻り値を返さなければなりません。

エラーを無視    ０
リトライする    −１
エラーにする    負の数（−１以外）

err_trapに（int（*）（））０を指定すると、エラー処理関数を呼び出さず、ファイル
システム内でエラー処理します。
初期化とマウントに成功すると０を、失敗すると負の数のエラーコードを返します。

＜プログラム例＞
#include <fsys.h>
#include <syswork.h>

    :
/* bssの終りからメモリの終わりまでをヒープとして使用し初期化する */
err = fsys_init(&_E_stk_bss, MEMEND + 1, (int (*)())0);
if (err < 0) {
    /* Initalize error */
    :
}
    :


■２．２  新しいファイルシステムの追加マウント


《名称》
fsys_mount 

《形式》
#include <fsys.h>

int fsys_mount(unsigned char *path, FSYS *fsys);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
mov.w #StructureOfFSYSpointer,ra1
call fsys_mount

《解説》
各デバイスドライバの初期化ルーチン内で使用し、ファイルシステムポインタを指定の
パス名の下のファイルをアクセスするドライバとして登録します。
（通常のアプリケーションで使用する事はありません）
これ以後、指定のパス名以下のファイルは、指定のファイルシステムが管理するファイ
ルとなります。

pathは128バイト以下で末尾に\0（0x00）が付加された文字列でなくてはなりません。
末尾の\0も128バイトの中に含みます。
（以下、断りが無い場合は、文字列の末尾には\0が付加されている事とします）
pathの英数の大文字と小文字は区別されます。

fsysは、mallocなどで確保したFSYS構造体へのポインタを指定します。
構造体の各メンバに値を設定した後で、fsys_mountの引数に指定してください。

typedef struct fsys {
unsigned char name[16];    /* デバイス名称 '\0' が終端 */
int (* dev_call)();        /* デバイスドライバの呼び出しエントリ */
void *dev_type;            /* デバイスのDPBポインタなど（任意） */
long access_f;             /* 使用中のフラグ（システムで使用） */
struct fsys *back;         /* 前のドライバへのポインタ（システムで使用） */
struct fsys *next;         /* 次のドライバへのポインタ（システムで使用） */
int path_len;              /* path の有効バイト数（システムで使用） */
unsigned char path[128];   /* マウントされたパス名（システムで使用） */
} FSYS ;

全く同じパス名がすでに登録されていた場合は、エラー（負の数）になります。
正常に登録された場合は０が返ります。

《関連事項》
fsys_ctrl, fsys_getfsys


■２．３  マウント済みのドライバとの直接インターフェース


《名称》
fsys_ctrl 

《形式》
#include <fsys.h>

int fsys_ctrl(unsigned char *path, int no, unsigned char *bf, int len);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
mov.w #FunctionNumber,ra1
mov.w #BufferAddress,ra2
mov.w #Length,ra3
call fsys_ctrl

《解説》
指定のパス名を受け持つドライバに対して、指定したインターフェースの実行を要求し
ます。
この処理の詳細は、各デバイスドライバにより任意に決定されます。
pathには、デバイス名とファイル名を連結したパス名を指定します。
no、bf、lenには任意の値を指定できます。アプリケーションプログラムとデバイスド
ライバの間で、任意の仕様を取り決めて使用します。
標準のデバイスである/SRAM、/CARDでは、以下の呼び出しが用意されています。

int fsys_ctrl("/SRAM", CTRL_IPLREAD, unsigned char *buf, int len)
IPLレコード（先頭１レコード）をbufにlenバイト読み込みます。
IPLレコードの大きさ（読み込んだバイト数より大きい場合がある）を返します。

int fsys_ctrl("/SRAM", CTRL_IPLWRITE, unsigned char *buf, int len)
IPLレコード（先頭１レコード）にbufをlenバイト書き込みます。
実際に書き込んだバイト数を返します。IPLレコードの大きさを超えては書き込みしま
せん。
IPLレコードの書き込みは、物理的なフォーマットと同じ意味を持ちますので、この書
き込みをした直後は、fsys_formatで論理フォーマットしなければいけません。
また、不正なデータを書き込むと、未フォーマットの状態になる場合があるので注意し
てください。

int fsys_ctrl("/SRAM", CTRL_BPBGET, BPB *buf, 0)
BIOSパラメータをbufに読み込みます。正常に読めた場合は０を返します。
未初期化だった場合、仮のパラメータを読み込み、NOT_FMTを返しますが、仮に読んだ
パラメータを用いてCTRL_BPBSETを行なう事ができます。
int fsys_ctrl("/SRAM", CTRL_BPBSET, BPB *buf, 0)
BIOSパラメータに buf を書き込みます。正常に書けた場合は０を返します。
BIOSパラメータの書き込みは、物理的なフォーマットと同じ意味を持ちますので、この
書き込みをした直後は、fsys_formatで論理フォーマットしなければいけません。

int fsys_ctrl("/SRAM", CTRL_GETSTAT, NULL, 0)
デバイスの状態を返します。

Bit7｜Bit6｜Bit5｜Bit4｜Bit3      ｜Bit2  ｜Bit1      ｜Bit0      
予約｜予約｜予約｜予約｜ライト不可｜レディ｜初期化済み｜バッテリー

/SRAMと/CARDでは、ライト不可は常に０に、レディとバッテリーは常に１になります。
初期化済みは、物理初期化がされている場合に１、初期化していない場合０です。

なにもマウントされていないパス名を指定した場合やその他のエラーが発生した場合は
負の数が返ります。

呼び出しに成功した場合は、デバイスドライバが返した値を、そのまま返します。
（呼び出しが成功して、デバイスドライバが負の数を返した場合も負の数が返る事に注
意してください）


■２．４  ファイルシステムのポインタの取得


《名称》
fsys_getfsys

《形式》
#include <fsys.h>

FSYS *fsys_getfsys(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_getfsys

《解説》
指定のパス名のデバイスドライバがマウントされているかどうかを検査したい場合に使
用します。

path には、”/SRAM/”のようにデバイスを含んだパス名を指定してください。パス名
はマウントしたパス名と完全に一致している必要はありません。

ある特定のデバイスドライバであるかどうかを調べる場合は、仕様やバージョンの異な
る同じパス名でアクセスするデバイスドライバがマウントされている可能性がある為、
返されたFSYS構造体のポインタを用い、メンバ名nameに格納されているデバイス名を確
認してください。

なにもマウントされていないパス名を指定した場合やその他のエラーが発生した場合は
０が返ります。

そのパス名でアクセスされるファイルを管理しているファイルシステムポインタが返り
ます。

＜プログラム例＞
/*
*ファイルシステムのポインタを得て、/SRAMでアクセスするデバイスの
*デバイス名が/DOS/SRAMである事を検査する
*/
#include <fsys.h>
FSYS *fsp;

    :
/* ポインタを得る */
fsp = fsys_getfsys((unsigned char *)"/SRAM");
if (fsp == 0) {
    /* Unmounted error */
    :
}
if (strcmp(fsp->name, "/DOS/SRAM") != 0) {
    /* Other device error */
    :
}
    :


■２．５  ファイルシステムのフォーマット


《名称》
fsys_format 

《形式》
#include <fsys.h>

int fsys_format(unsigned char *path, unsigned char *fmt_id);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
mov.w #FormatIdentifier,ra1
call fsys_format

《解説》
指定のパス名にマウントされているファイルシステムに対して、フォーマットを実行し
ます。
既存のデータはすべて消去されます。但し、物理フォーマットは行いません。

pathにはマウントしたパス名を指定します。ボリューム名を連結して指定する事もでき
ます。
fmt_idには誤フォーマットを防ぐため"FSYS_FORMAT_OK"の文字列を指定する必要があり
ます。
物理フォーマットを行う場合は、fsys_ctrlのCTRL_BPBGET、CTRL_BPBSETを使用してく
ださい。

正常終了の場合は０が返ります。

なにもマウントされていないパス名を指定した場合や、"FSYS_FORMAT_OK"の文字列を指
定していない場合はエラーが返ります。

何らかのファンクションで指定のファイルシステムを使用中の場合は、fsys_formatは
エラーになります。

＜プログラム例＞
/*
*内蔵メモリデバイスのフォーマット
*/
#include <fsys.h>

int sts;
BPB buf;

:
/* 物理フォーマット */
fsys_ctrl("/SRAM",CTRL_BPBGET,&buf,0);
fsys_ctrl("/SRAM",CTRL_BPBSET,&buf,0);
/* 論理フォーマット */
sts = fsys_format((unsigned char *)"/SRAM/VOLUME_NAME", (unsigned char *)"FSYS_FORMAT_OK");
if (sts == BAD_CMD) { /* fmt_id error */ }
if (sts == PATH_OVER) { /* path string too long error */ }
if (sts == BAD_PATH) { /* illigal path name */ }
if (sts == UMOUNTED) { /* file system no mount */ }
if (sts == MOUNTBUSY) { /* exist open file */ }
if (sts < 0 ) { /* other error */ }


■２．６  ファイルシステムの空き容量の取得


《名称》
fsys_diskfree 

《形式》
#include <fsys.h>

long fsys_diskfree(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_diskfree

《解説》
指定のパス名にマウントされているファイルシステムが管理するデバイスの空き容量を
調べ、そのバイト数を求めます。

pathには、デバイスを含んだパス名を指定してください。パス名はマウントしたパス名
そのものである必要はありません。

指定パス名でアクセスされるファイルを管理しているファイルシステムの空き容量がバ
イト数単位で返ります。

なにもマウントされていないパス名を指定した場合や、その他のエラーが発生した場合
はエラー（負の数）が返ります。

＜プログラム例＞
#include <fsys.h>

long d_free;

    :
d_free = fsys_diskfree((unsigned char *)"/SRAM");
if (d_free >= 2048L) {
    fsys_write(fhd,buffer,1024);
}


■２．７  ファイルシステムの論理ブロックサイズの取得


《名称》
fsys_getblocks

《形式》
#include <fsys.h>

long fsys_getblocks(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_getblocks

《解説》
論理ブロックサイズとは、ファイルを作成した時に消費される容量の最小単位で大きさ
１バイトのファイルを作成した時に消費される大きさです。
複数のファイルを新たに作成する場合、作成の前にディスクの空き領域が足りるかどう
かを調べる場合に使用します。

pathには、デバイスを含んだパス名を指定してください。パス名はマウントしたパス名
そのものである必要はありません。

指定ファイルシステムの論理ブロックサイズの大きさがバイト数で返されます。
なにもマウントされていないパス名を指定した場合や、その他のエラーが発生した場合
はエラー（負の数）が返ります。

《注意》
複数のファイルを作る場合、単純にfsys_diskfreeで調べても、足りるかどうか判りま
せん。

なぜなら、100バイトのファイルを２つ作る場合に空き容量が256バイトあっても論理
ブロックサイズが256バイトだと、実際に必要な容量は 256×２=512 で容量が足りなく
なります。

１つのファイルに消費するバイト数は以下の式で求められるので、すべてのファイルの
消費バイト数を合計したバイト数と、ディスクの空き容量バイト数を比較すれば事前に
容量が足りるかどうか判断できます。

（ファイルサイズ÷論理ブロックサイズ＋１）×論理ブロックサイズ＝消費バイト数

＜プログラム例＞
#include <fsys.h>

long blk_siz;
long d_free;
long free_block;

    :
blk_siz = fsys_getblocks((unsigned char *)"/SRAM");
d_free = fsys_diskfree((unsigned char *)"/SRAM");
free_block = d_free / blk_siz;
    :


■２．８  ファイルのオープン


《名称》
fsys_open 

《形式》
#include <fsys.h>

int fsys_open(unsigned char *path, int mode);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
mov.w #AccessMode,ra1
call fsys_open

《解説》
指定のパス名でアクセスできるファイルを、指定のモードでオープンし、オープンした
ファイルのハンドル番号を返します。

pathにはオープンするファイル名を指定します。
modeには、新規作成／書き込み用／読み込み用などを指定します。

O_READ       /* 読み込み用にオープン */
O_WRITE      /* 書き込み用にオープン */
O_APPEND     /* 追加書込用にオープン。オープン後、ファイル終端にシークする */
O_CREAT      /* 存在しない場合エラーにせず新規作成。O_WRITEと同時に指定する */
O_TRUNC      /* 既存の場合は古い内容はすべて捨てる。O_WRITEと同時に指定する */
O_EXCL       /* 既存の場合はエラーにする。O_WRITEと同時に指定する */

O_EXCLを指定した場合、既存のファイルを指定するとエラーが返ります。
O_CREATを指定しない場合、ファイルが存在しないとエラーが返ります。

O_APPENDを指定した場合、オープン後にファイル終端にシークしますのでシークせずに
書き込むとファイル末尾に書き足します。シークした場合はシークした位置から上書き
します。
常に末尾に書き足す訳ではありません。

正しくオープンできた場合は、０を含む正の整数（ファイルハンドル）が返ります。

なにもマウントされていないパス名を指定した場合や、その他のエラーが発生した場合
はエラー（負の数）が返ります。

ファイルを新規作成する場合は、必ず専用のディレクトリを作成して、そのディレクト
リの中にファイルを作成してください。
ルートディレクトリにはファイルを作成しないでください。
ルートディレクトリにファイルを作成してしまうと、ROM内に用意されている「ファイ
ルメンテナンス」でメンテナンスできなくなります。

＜プログラム例１＞
#include <fsys.h>

int fhd;

    :
/* 読み込み用としてオープン */
fhd=fsys_open((unsigned har *)"SCORE_FILE.DAT",O_READ);
if (fhd < 0) {
    /* Can not open */
}
fsys_read(fhd,buffer,len);

＜プログラム例２＞
#include <fsys.h>

int fhd;
    :
/* ファイルが存在している場合でも存在しない場合でも新規作成する */
fhd=fsys_open((unsigned char *)"NEW.DAT",O_WRITE|O_CREAT|O_TRUNC);
if (fhd < 0) { /* Can not open */ }
fsys_write(fhd,buffer,len);
    :


■２．９  ファイルからのデータ読み込み


《名称》
fsys_read 

《形式》
#include <fsys.h>

int fsys_read(int hnd, unsigned char *bf, int length);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FileHandle,ra0
mov.w #BufferPointer,ra1
mov.w #Length,ra2
call fsys_read

《解説》
指定のファイルハンドルから、指定のバイト数のデータを指定バッファに読み込みま
す。

hndには、読み込むファイルのファイルハンドルを指定します。
bfには、読み込むバッファのポインタを指定します。
lengthには、読み込むバイト数を指定します。

正常終了の場合は、読み込んだバイト数と同じ値を返します。
エラーの場合は、読み込もうとしたバイト数と異なる値を返します。

すなわち、エラー発生前に１バイトも読み込んでいない時は負の数（エラーコード）を
返し、１バイトでも読み込んでいる時はそれまでに読んだバイト数を返します。

また、ファイルの終りの位置で読もうとした場合は０を返します。

＜プログラム例＞
#include <fsys.h>

int fhd;
int rlen;
unsigned char buffer[256];

    :
/* 読み込み用としてオープン */
fhd=fsys_open((unsigned char *)"SCORE_FILE.DAT",O_READ);
    if (fhd < 0) { /* Can not open */ }
/* bufferの大きさ（256バイト）単位に処理する */
while(1) {
    rlen=fsys_read(fhd,buffer,256);
    if (rlen > 0) {
        /* rlenバイト数分の処理 */
        if (rlen != 256) {
            break; /* 256バイト未満の最後のブロック、つまりEOFだった */
        }
    } else if (rlen == 0) {
        break; /* EOFだった */
    } else {
        break; /* EOF以外の何かのエラーが発生した */
    }
}
fsys_close(fhd);
    :


■２．１０  ファイルへのデータ書き込み


《名称》
fsys_write 

《形式》
#include <fsys.h>

int fsys_write(int hnd, unsigned char *bf, int length);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FileHandle,ra0
mov.w #BufferPointer,ra1
mov.w #Length,ra2
call fsys_write

《解説》
指定のファイルハンドルに、指定バッファの指定のバイト数のデータを書き込みます。

hndには、書き込むファイルのファイルハンドルを指定します。
bfには、書き込むバッファのポインタを指定します。
lengthには、書き込むバイト数を指定します。

既存のファイルに上書きしている時に元のファイルサイズより小さくしたい場合は切り
詰める位置にシークした後に長さ０の書き込みを行なって後ろの不要部分を切り詰めて
ください。

正常終了の場合は、書き込んだバイト数と同じ値を返します。
エラーの場合は、書き込もうとしたバイト数と異なる値を返します。

すなわち、エラー発生前に１バイトも書き込んでいない時は負の数（エラーコード）を
返し、１バイトでも書き込んでいる時はそれまでに書いたバイト数を返します。

例外として、長さに０を指定した場合は、ファイルの現在のシーク位置以後を切り詰め
て０を返します。

＜プログラム例＞
#include <fsys.h>

int fhd;
int wlen;
unsigned char buffer[256];

    :
/* 書き込み用としてオープン */
fhd=fsys_open((unsigned char *)"SCORE_FILE.DAT",O_WRITE|O_CREAT|O_TRUNC);
if (fhd < 0) { /* Can not open */ }
/* buffer の大きさ（256 バイト）単位に処理する */
while(1) {
    /* buffer にデータを用意 */
    wlen=fsys_write(fhd,buffer,256);
    if (wlen > 0) {
        if (wlen != 256) {
            break; /* 数バイト書いたが、すべて書けない、つまりDISK_FULLだった */
        }
    } else if (wlen == DISK_FULL) {
        break; /* DISK_FULL だった */
    } else {
        break; /* DISK_FULL 以外の何かのエラーが発生した */
    }
}
fsys_close(fhd);
    :


■２．１１  ファイルポインタの移動


《名称》
fsys_seek

《形式》
#include <fsys.h>

long fsys_seek(int hnd, long offset, int base);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FileHandle,ra0
mov.w #SeekOffset,ra1
mov.w #SeekBase,ra2
call fsys_seek

《解説》
ファイルポインタを移動します。

hndには、ファイルポインタを移動するファイルのファイルハンドルを指定します。
offsetには移動の量を指定し、正の数で加算方向（ファイルの末尾方向）に、
負の数で減算方向（ファイルの先頭方向）に移動します。
baseには移動の基準点を指定します。

SEEK_SET    /* 先頭を基準にした移動 */
SEEK_CUR    /* 現在位置を基準にした移動 */
SEEK_END    /* 末尾を基準にした移動 */

移動後、読み書きは、シークした位置から行ないます。
シークする位置は、オフセットとベースの組み合わせで指定します。

ファイルのサイズを越えた移動はできません。（ファイルサイズを大きくする事はしま
せん）

正常終了の場合、移動後の位置（先頭からの現在位置）を返します。
エラーの場合負の数のエラーコードを返します。

＜プログラム例＞
/*
*ファイルの長さを得る
*/
#include <fsys.h>

long get_file_size(int hnd)
{
long cur_pos;
long file_size;

cur_pos = fsys_seek(hnd,0L,SEEK_CUR);    /* 現在位置を得る */
file_size = fsys_seek(hnd,0L,SEEK_END);  /* 終端へ。終端位置＝大きさが返る */
fsys_seek(hnd,cur_pos,SEEK_SET); /* 元の位置に戻す */
return(file_size);
}


■２．１２  ファイルの修正日時の設定と読み出し


《名称》
fsys_htime 

《形式》
#include <fsys.h>

long fsys_htime(int hnd, long time);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FileHandle,ra0
mov.w #Time,ra1
call fsys_htime

《解説》
指定のファイルハンドルの修正日時を設定、読み出しします。

hndには、日付の設定、読み出しをするファイルのファイルハンドルを指定します。
timeに−１を指定すると、現在のファイル修正日時を読み出します。読み出しの指定は
０ではなく−１なので注意してください。

timeに−１以外を指定すると、修正日付を設定します。
timeに０を指定すると、日付なしに設定されるので注意してください。
timeに指定する値の構造は以下の通りです。

bit｜31-25  ｜24-21｜20-16｜15-11｜10-5  ｜4-0
   ｜YYYYYYY｜MMMM ｜DDDDD｜HHHHH｜MMMMMM｜SSSSS
     年-1980   月     日      時     分    秒/2 

設定は、書き込みモードでオープンされたファイルハンドルにのみ有効であり、全ての
書き込み動作を行なったあとfsys_closeの直前に設定した場合のみ有効です。
設定後、書き込み動作を行なった場合は、設定した修正日時は無効となり、書き込みを
行なった現在時刻が修正日付になるので注意してください。

正常終了の場合、日付設定では０を、日付読み出しでは以下の構造の値を返します。

bit｜31-25  ｜24-21｜20-16｜15-11｜10-5  ｜4-0
   ｜YYYYYYY｜MMMM ｜DDDDD｜HHHHH｜MMMMMM｜SSSSS
     年-1980   月     日      時     分    秒/2 

正常終了であっても2044年以降の日付が返されると、戻り値が負の数になるのでエラー
と混同しないように注意してください。

エラーの場合、−１〜-65536の範囲の負の数のエラーコードを返します。
＜プログラム例＞
/*
＊ファイル内容のコピーを行ない、修正日付もコピーする
*/
#include <fsys.h>

int    fhd1,fhd2;
int    len1,len2;
long  f_time;
unsigned char buffer[256];

    :
  /* 書き込み用としてオープン */
  fhd1=fsys_open((unsigned char *)"SCORE_FILE.DAT",O_READ);
  if (fhd1 < 0) { /* Can not open */ }
  /* 書き込み用としてオープン */
  fhd2=fsys_open((unsigned char *)"SCORE_FILE.NEW",O_WRITE|O_CREAT|O_TRUNC);
  if (fhd2 < 0) { /* Can not open */ }
  /* コピー元ファイルの修正日付の読み出し */
  f_time=fsys_htime(fhd1,-1L);
  /* bufferの大きさ（256バイト）単位に処理する */
  while(1) {
    /* bufferを使ってデータをコピー */
    len1=fsys_read(fhd1,buffer,256);
    len2=fsys_write(fhd2,buffer,len1);
    if (len1 != 256) break; /* 最後まで読み書きした */
    if (len2 > 0) {
    if (len2 != 256) {
    break; /* 数バイト書いたが、すべて書けない、つまりDISK_FULLだった */
    }
    } else if (len2 == DISK_FULL) {
    break; /* DISK_FULLだった */
    } else {
    break; /* DISK_FULL以外の何かのエラーが発生した */
    }
  }
  /* ファイルを閉じる */
  fsys_close(fhd1);
  /* コピー先ファイルの修正日付の設定。閉じる直前に行う事 */
  fsys_htime(fhd2,f_time);
  /* ファイルを閉じる */
  fsys_close(fhd2);
    :


■２．１３  ファイルのクローズ


《名称》
fsys_close

《形式》
#include <fsys.h>

int fsys_close(int hnd);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FileHandle,ra0
call fsys_close

《解説》
指定のファイルハンドルをクローズします。
hndには、クローズするファイルのファイルハンドルを指定します。

書き込みのあったファイルの場合、fsys_htimeによる修正日時の設定がないものあるい
はfsys_htimeによる設定の後で書き込みのあったファイルは、close時点の日時が修正
日時となります。

正常終了の場合、０を返します。

エラーの場合負の数のエラーコードを返します。

＜プログラム例＞
#include <fsys.h>

int fhd;
int wlen;
unsigned char buffer[256];

    :
/* 読み込み用としてオープン */
  fhd=fsys_open((unsigned char *)"SCORE_FILE.DAT",O_READ);
  if (fhd < 0) { /* Can not open */ }
  /* bufferにデータを読む */
  fsys_read(fhd,buffer,256);
  /* ファイルを閉じる */
  fsys_close(fhd);
    :


■２．１４  ファイルの削除


《名称》
fsys_delete 

《形式》
#include <fsys.h>

int fsys_delete(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_delete

《解説》
指定したファイルを削除します。
pathには、削除するファイル名を指定してください。

ディレクトリは削除できません。

正しく削除できた場合は、０を返します。

なにもマウントされていないパス名を指定した場合や、存在しないファイルを指定した
場合、その他のエラーが発生した場合はエラー（負の数）が返ります。

＜プログラム例＞
/*
＊古いファイルを消去し、新たに作っておいたファイルと置き換える
*/
#include <fsys.h>

    :
  fsys_delete((unsigned char *)"SCORE.DAT");
  fsys_rename((unsigned char *)"SCORE.NEW",(unsigned char *)"SCORE.DAT");
    :


■２．１５  ファイル名変更


《名称》
fsys_rename

《形式》
#include <fsys.h>

int fsys_rename(unsigned char *old_path, unsigned char *new_name);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #OldParh,ra0
mov.w #NewPath,ra1
call fsys_rename

《解説》
指定したファイルの名称を変更します。
old_pathには、変更したいファイルを指定します。
new_nameには、新しい名称のパス名を除いたファイル名部分のみを指定します。
new_nameにパス名を含めてはいけません。ファイル名のみを指定してください。つまり
違うディレクトリへの移動はできません。

正しく変更できた場合は、０を返します。

なにもマウントされていないパス名を指定した場合や、存在しないファイルを指定した
場合、新しい名称と同じ名前でファイルやディレクトリがすでに存在している場合、そ
の他のエラーが発生した場合はエラー（負の数）が返ります。

＜プログラム例＞
/* 古いファイルを消去し、新たに作っておいたファイルと置き換える */
#include <fsys.h>

    :
  fsys_delete((unsigned char *)"SCORE.DAT");
  fsys_rename((unsigned char *)"SCORE.NEW",(unsigned char *)"SCORE.DAT");
    :


■２．１６  ディレクトリ作成


《名称》
fsys_mkdir 

《形式》
#include <fsys.h>

int fsys_mkdir(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_mkdir

《解説》
指定のパス名で新しいディレクトリを作成します。
pathには、作成したいディレクトリのパス名を指定します。

正しく作成できた場合は、０を返します。

なにもマウントされていないパス名を指定した場合や、同じ名前でファイルやディレク
トリがすでに存在している場合、その他のエラーが発生した場合はエラー（負の数）が
返ります。

ディレクトリの中にサブディレクトリを作成しないでください。必ずルートディレクト
リの中にディレクトリを作成してください。もしサブディレクトリを作成すると、ROM
内に用意されている「ファイルメンテナンス」でメンテナンスできなくなります。

ディレクトリ名は、18文字以内と拡張子３文字で構成します。
拡張子は、必ず指定された「メーカーID」の３文字を使用してください。例えばメーカ
ーIDが「HUD」だった場合、ディレクトリ「GAME01」を作りたいならば「GAME01.HUD」
というディレクトリを指定してください。

フリーソフトとして発表する場合は特別に「FSW」のメーカーIDを使用することが認め
られています。ディレクトリ名で他のフリーソフトとぶつからないように考えて使用し
てください。フリーソフトでない場合は、正式にメーカーIDを取得して使用してくださ
い。
拡張子がなかったり、メーカーIDと異なる拡張子を使用しているとマスターの承認が受
けられませんので注意してください。

＜プログラム例＞
#include <fsys.h>

int mkdir(unsigned char *name)
{
if (fsys_mkdir(name) < 0) {
    dprint(2,4,"ディレクトリが作成できませんでした");
    return -1;
}
return 0;
}


■２．１７  ディレクトリ削除


《名称》
fsys_rmdir 

《形式》
#include <fsys.h>

int fsys_rmdir(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_rmdir

《解説》
指定のパス名の既存のディレクトリを削除します。
pathには、削除したいディレクトリのパス名を指定します。

正しく削除できた場合は、０を返します。

なにもマウントされていないパス名を指定した場合や、存在しないディレクトリを指定
した場合、指定ディレクトリの中にファイルが存在する場合、カレントディレクトリに
なっている場合、その他のエラーが発生した場合はエラー（負の数）が返ります。

＜プログラム例＞
#include <fsys.h>

int rmdir(unsigned char *name)
{
if (fsys_rmdir(name) < 0) {
    dprint（2,4,"ディレクトリが削除できませんでした"）;
    return -1;
}
return 0;
}


■２．１８  カレントディレクトリの移動


《名称》
fsys_chdir 

《形式》
#include <fsys.h>

int fsys_chdir(unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Path,ra0
call fsys_chdir

《解説》
指定のディレクトリにカレントディレクトリを移動します。
pathには、移動したいディレクトリのパス名を指定します。

移動後のディレクトリを司どるファイルシステムが使用中になり、初期化ができなくな
ります。

正しく移動できた場合は、０を返します。

なにもマウントされていないパス名を指定した場合や、存在しないディレクトリを指定
した場合、その他のエラーが発生した場合はエラー（負の数）が返ります。

＜プログラム例＞
#include <fsys.h>

int chdir(unsigned char *name)
{
if (fsys_chdir(name) < 0) {
    dprint(2,4,"ディレクトリが見つかりません");
    return -1;
}
return 0;
}


■２．１９  カレントディレクトリの取得


《名称》
fsys_curdir 

《形式》
#include <fsys.h>

int fsys_curdir(unsigned char *buff);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #BufferPointer,ra0
call fsys_curdir

《解説》
現在のカレントディレクトリ名を指定バッファに取得します。

buffには、取得したディレクトリ名を格納するバッファのポインタを指定します。
buffは128バイト必要です。

常に０が返されます。

＜プログラム例＞
#include <fsys.h>

static unsigned char buf[128];

unsigned char *getwd
{
fsys_curdir(buf);
return buf;
}


■２．２０  ファイル検索の開始


《名称》
fsys_ffiles 

《形式》
#include <fsys.h>

int fsys_ffiles(FILESBF *bf, unsigned char *path);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FILESBF_Pointer,ra0
mov.w #Path,ra1
call fsys_ffiles

《解説》
指定のファイル名と一致するファイルを検索します。（初回の検索にのみ使用します）

指定のパス名（ファイル名部分に*や?のワイルドカードが使用可能）と一致するファイ
ルを検索して、FILESBF構造体に情報をセットします。

bfには、検索用制御構造体FILESBFへのポインタを指定します。検索の結果はこの構造
体に格納され、また、次のファイル検索の為にも使用します。

typedef struct filesbf {
int fsys_flg;           /* システム予約 */
FSYS *fsysp;            /* 対応するドライバへのポインタ */
unsigned char temp[64]; /* システム予約 */
long fsize;             /* ファイルのサイズ（DIR、VOLは０） */
long ftime;             /* 作成日付時刻 */
int atr;                /* ファイル属性 */
unsigned char path[128];/* パス名＋０＋ファイル名＋０ */
unsigned char *name;    /* ファイル名へのポインタ */
unsigned char *upath;   /* ユーザーパス名へのポインタ */
int name_max;           /* nameの最大長 */
} FILESBF ;
filesbf.path、 filesbf.name、 filesbf.upath、 filesbf.name_max の関係は以下の
とおり。
                                              ←      filesbf.name_max      →
                0                                                          127
                −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
   filesbf.path｜   /CARD   ｜  DIR.MID  ｜0｜ FILENAME.EXT ｜0｜    不定    ｜
                −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
                              ↑             ↑
                             filesbf.upath    filesbf.name


pathには、検索したいファイルのパス名を指定します。ファイル名部分に*や?のワイル
ドカード文字が使用可能です。

'.'（自分）や'..'（親）ディレクトリがある場合、検索対象になり情報が返ります。

検索中のディレクトリを司どるファイルシステムが使用中になり、初期化ができなくな
ります。

見つかった場合は０が返ります。

見つからなかった場合はエラーとしてNO_FILESが返ります。

なにもマウントされていないパス名を指定した場合や、その他のエラーが発生した場合
はNO_FILES以外のエラー（負の数）が返ります。

《関連事項》
fsys_mount, fsys_nfiles, fsys_efiles

＜プログラム例＞
#include <stdio.h>
#include <fsys.h>

void list_files(unsigned char *name)
{
int col = 5, status;
FILESBF filbuf;

if ((status = fsys_ffiles(&filbuf, name)) < 0) {
    char buf[64];

    sprintf（buf, "システムエラー%dが発生しました", status);
    dprint(2, 4, buf);
    return;
}
if (status == NO_FILES) {
    dprint（2, 4, "ファイルが見つかりません"）;
    return;
}

dprint(col++, filbuf.name);
while (fsys_nfiles(&filbuf) == 0) {
    dprint(col++, filbuf.name);
}
fsys_efiles(&filbuf);
}


■２．２１  ファイル検索の継続


《名称》
fsys_nfiles 

《形式》
#include <fsys.h>

int fsys_nfiles(FILESBF *bf);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FILESBF_Pointer,ra0
call fsys_nfiles

《解説》
検索情報に一致するファイルを検索します。（２回目以降の検索に使用します）

FILESBF構造体にセットされている検索情報を元にして前回の検索を継続し、FILESBF構
造体に情報をセットします。

bfには、検索用制御構造体FILESBFへのポインタを指定します。検索の結果はこの構造
体に格納され、また、次のファイル検索の為にも使用します。

bfは、一度 fsys_ffiles か、または fsys_nfiles に指定したポインタでなければなり
ません。

'.'（自分）や '..'（親）ディレクトリがある場合、検索対象になり情報が返ります。

検索中のディレクトリを司どるファイルシステムが使用中になり、フォーマットができ
なくなります。

見つかった場合は０が返ります。
見つからなかった場合はエラーとしてNO_FILESが返ります。

その他のエラーが発生した場合はNO_FILES以外のエラー（負の数）が返ります。

《関連事項》
fsys_ffiles, fsys_efiles


■２．２２  ファイル検索の終了


《名称》
fsys_efiles 

《形式》
#include <fsys.h>

int fsys_efiles(FILESBF *bf);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #FILESBF_Pointer,ra0
call fsys_efiles

《解説》
検索情報を元に、ファイル検索の終了を通知します。（検索終了後に使用します）

FILESBF構造体にセットされている検索情報を元にして、検索終了をファイルシステム
に通知します。

bfには、検索用制御構造体FILESBFへのポインタを指定します。

bfは、一度 fsys_ffiles か、または fsys_nfiles に指定したポインタでなければなり
ません。

終了の通知を行わないと、検索中のディレクトリを司どるファイルシステムが使用中に
なったままになり、フォーマットができなくなります。

常に０が返されます。

《関連事項》
fsys_ffiles, fsys_nfiles


■２．２３  システム内部日付の設定と読み出し


《名称》
fsys_datetime

《形式》
#include <fsys.h>

long fsys_datetime(long time);

《アセンブラ形式》  ＊
include "fsys.sh"

mov.w #Date_Time,ra0
call fsys_datetime

《解説》
システム内部の日付を設定、読み出します。

日付の設定を行なうと、これ以降に作られるファイル、ボリューム名、ディレクトリの
作成日時が、指定した日時になります。
timeに−１を指定すると、現在の日時を読み出します。読み出しの指定は０ではなく
−１なので注意してください。

timeに−１以外を指定すると、修正日付を設定します。
timeに０を指定すると、日付なしに設定されるので注意してください。
timeに指定する値の構造は以下の通りです。

bit｜ 31-25 ｜ 24-21｜20-16｜15-11｜ 10-5 ｜ 4-0
   ｜YYYYYYY｜ MMMM ｜DDDDD｜HHHHH｜MMMMMM｜SSSSS
     年-1980    月     日     時      分     秒/2


fsys_initによるファイルシステムの初期設定の直後は、内部日付は「日付なし」にな
っているので、アプリケーションにより、適当な日付（例えば発売日など）を設定して
からファイルやディレクトリを作成してください。
設定では変更前の日付を、読み出しでは現在の日付を返します。
返される値は、以下の構造です。


bit｜ 31-25 ｜ 24-21｜20-16｜15-11｜ 10-5 ｜ 4-0
   ｜YYYYYYY｜ MMMM ｜DDDDD｜HHHHH｜MMMMMM｜SSSSS
     年-1980    月     日     時      分     秒/2


2044年以降の日付が返されると、戻り値が負の数になるのでエラーと混同しないように
注意してください。なお、エラーは発生しません。

＜プログラム例＞
/*
*日付を1994年８月18日14時31分24秒に設定する
*/
#include <fsys.h>

long old_time;

    :
old_time = fsys_datetime(0x1d1273ec);
    :


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第３章  内蔵ＳＲＡＭの扱いについて


容量３２Ｋバイト、先頭の１セクタはリザーブされ、以下の仕様となります。

１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：１セクタ
論理ブロックサイズ                ：１２８バイト
FATの占めるセクタ数               ：３セクタ
ルートディレクトリの個数          ：６４個
ルートディレクトリのセクタ数      ：１６セクタ
データ及びファイルディレクトリ領域：２３６ブロック、３０２０８バイト

アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
   0000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
   0080 ｜
        ｜FAT1-FAT3 (3 SECTOR 254 ENTRY)
   0200 ｜
        ｜ROOT DIR1-DIR16 (16 SECTOR 64 ENTRY)
   0A00 ｜
        ｜DATA or FILE DIR AREA (236 BLOCK 30208 BYTE)
   8000 ｜


＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
第４章  外部カードの扱いについて


最大容量で８Ｍバイトまで可能です。

容量は、８Ｍ、４Ｍ、２Ｍ、１Ｍ、５１２Ｋ、２５６Ｋ、１２８Ｋの７種類がサポート
されます。（初期化時に自動で容量を検査します）

先頭の１セクタはリザーブされ、以下の仕様となります。


■４．１  ８Ｍバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：８セクタ
論理ブロックサイズ                ：１０２４バイト
FATの占めるセクタ数               ：１２８セクタ
ルートディレクトリの個数          ：２５２個
ルートディレクトリのセクタ数      ：６３セクタ
データ及びファイルディレクトリ領域：８１６８ブロック、８３６４０３２バイト

アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT128 (128 SECTOR 8190 ENTRY)
 004080 ｜
        ｜ROOT DIR1-DIR63 (63 SECTOR 252 ENTRY)
 006000 ｜
        ｜DATA or FILE DIR AREA (8168 BLOCK 8364032 BYTE)
 800000 ｜


■４．２  ４Ｍバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：４セクタ
論理ブロックサイズ                ：５１２バイト
FATの占めるセクタ数               ：１２８セクタ
ルートディレクトリの個数          ：２５２個
ルートディレクトリのセクタ数      ：６３セクタ
データ及びファイルディレクトリ領域：８１４４ブロック、４１６９７２８バイト

アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT128 (128 SECTOR 8190 ENTRY)
 004080 ｜
        ｜ROOT DIR1-DIR63 (63 SECTOR 252 ENTRY)
 006000 ｜
        ｜DATA or FILE DIR AREA (8144 BLOCK 4169728 BYTE)
 400000 ｜


■４．３  ２Ｍバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：２セクタ
論理ブロックサイズ                ：２５６バイト
FATの占めるセクタ数               ：１２７セクタ
ルートディレクトリの個数          ：２５６個
ルートディレクトリのセクタ数      ：６４セクタ
データ及びファイルディレクトリ領域：８０９６ブロック、２０７２５７６バイト


アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT127 (127 SECTOR 8126 ENTRY)
 004000 ｜
        ｜ROOT DIR1-DIR64 (64 SECTOR 256 ENTRY)
 006000 ｜
        ｜DATA or FILE DIR AREA (8096 BLOCK 2072576 BYTE)
 200000 ｜


■４．４  １Ｍバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：１セクタ
論理ブロックサイズ                ：１２８バイト
FATの占めるセクタ数               ：１２６セクタ
ルートディレクトリの個数          ：２６０個
ルートディレクトリのセクタ数      ：６５セクタ
データ及びファイルディレクトリ領域：８０００ブロック、１０２４０００バイト


アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT126 (126 SECTOR 8062 ENTRY)
 003F80 ｜
        ｜ROOT DIR1-DIR65 (65 SECTOR 260 ENTRY)
 006000 ｜
        ｜DATA or FILE DIR AREA (8000 BLOCK 1024000 BYTE)
 100000 ｜


■４．５  ５１２Ｋバイトの場合


１セクタのバイト数：１２８バイト
１FATの管理するセクタ数：１セクタ
論理ブロックサイズ：１２８バイト
FATの占めるセクタ数：４７セクタ
ルートディレクトリの個数：２５６個
ルートディレクトリのセクタ数：６４セクタ
データ及びファイルディレクトリ領域：３９８４ブロック、５０９９５２バイト


アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT47 (47 SECTOR 4008 ENTRY)
 001800 ｜
        ｜ROOT DIR1-DIR64 (64 SECTOR 256 ENTRY)
 003800 ｜
        ｜DATA or FILE DIR AREA (3984 BLOCK 509952 BYTE)
 800000 ｜


■４．６  ２５６Ｋバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：１セクタ
論理ブロックサイズ                ：１２８バイト
FATの占めるセクタ数               ：２３セクタ
ルートディレクトリの個数          ：２５６個
ルートディレクトリのセクタ数      ：６４セクタ
データ及びファイルディレクトリ領域：１９６０ブロック、２５０８８０バイト


アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT23 (23 SECTOR 1960 ENTRY)
 000C80 ｜
        ｜ROOT DIR1-DIR64 (64 SECTOR 256 ENTRY)
 002C00 ｜
        ｜DATA or FILE DIR AREA (1960 BLOCK 250880 BYTE)
 040000 ｜



■４．７  １２８Ｋバイトの場合


１セクタのバイト数                ：１２８バイト
１FATの管理するセクタ数           ：１セクタ
論理ブロックサイズ                ：１２８バイト
FATの占めるセクタ数               ：１２セクタ
ルートディレクトリの個数          ：２５２個
ルートディレクトリのセクタ数      ：６３セクタ
データ及びファイルディレクトリ領域：９４８ブロック、１２１３４４バイト


アドレス｜内容
−−−−−−−−−−−−−−−−−−−−−−−−−−−
 000000 ｜
        ｜CHECK ID & BPB & SYSTEM DATA
 000080 ｜
        ｜FAT1-FAT12 (12 SECTOR 1022 ENTRY)
 000680 ｜
        ｜ROOT DIR1-DIR63 (63 SECTOR 252 ENTRY)
 002600 ｜
        ｜DATA or FILE DIR AREA (948 BLOCK 121344 BYTE)
 020000 ｜



＊……アセンブラを利用する際、使用するものです。
  尚、「ＧＭＡＫＥＲ」スタータキットではアセンブラはサポートされておりません。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

《著作権及び登録商標等》

・FILELIB.A 及び FILELIB.TXT（以下、"本ソフトウェア"という）は、ＰＣ−ＦＸＧＡ
  用のソフトウェア開発ツールの一部です。本ソフトウェアを、ＰＣ−ＦＸ、ＰＣ−Ｆ
  ＸＧＡ用のソフトウェア開発以外の目的で使用しないで下さい。

・本ソフトウェアを使用した結果、直接及び間接的に生じた損害について、株式会社ハ
  ドソンは、一切の責任または債務を負わないものとします。

・本ソフトウェアの操作方法、技術的内容、その他の質問について、株式会社ハドソン
  では、直接お答えしていません。お問い合わせはご遠慮下さい。

・本ソフトウェアの使用に際し、「ソフトウェアのご使用条件」をよくご覧いただき、
  ご利用下さいますようお願い致します。

・本ソフトウェアの著作権は、株式会社ハドソンが保有しています。


MS-DOSは米国マイクロソフト社の登録商標です。
その他、記載されている会社名、製品名は、各社の登録商標または商標です。


                                                            (C)1995 HUDSON SOFT

